package controllers

import (
	"gin-project/models"
	"gin-project/utils"
	"log"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// RegisterRequest 注册请求结构体
type RegisterRequest struct {
	Username string `json:"username" binding:"required,min=3,max=50"`
	Email    string `json:"email" binding:"required,email"`
	Password string `json:"password" binding:"required,min=6"`
}

// LoginRequest 登录请求结构体
type LoginRequest struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
}

// Register 用户注册
func Register(c *gin.Context){
	var req RegisterRequest
	//验证请求数据
	if err := c.ShouldBindJSON(&req);err !=nil{
		utils.BadRequest(c,"无效的请求:" + err.Error())
		return
	}
	// 检查用户是否已存在
	existingUser, _ := models.GetUserByUsername(req.Username)
	if existingUser !=nil{
		utils.BadRequest(c,"用户名已存在")
		return
	}

	// 创建新用户
	user := &models.User{
		Username: req.Username,
		Email:    req.Email,
		Password: req.Password, // 密码会在BeforeSave钩子中加密
	}
	if err := models.CreateUser(user); err !=nil{
		utils.ServerError(c, "创建用户失败: "+err.Error())
		return
	}
	utils.Success(c,gin.H{
		"id":       user.ID,
		"username": user.Username,
		"email":    user.Email,
	})
}

// Login 处理用户登录
func Login(c *gin.Context){
	var req LoginRequest
	//验证请求的数据
	if err := c.ShouldBindJSON(&req); err!=nil{
		utils.BadRequest(c, "无效的请求参数: "+err.Error())
		return
	}
	// 查询用户
	user ,err := models.GetUserByUsername(req.Username)
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			utils.Unauthorized(c, "用户名或密码错误")
			return
		}
		utils.ServerError(c, "查询用户失败: "+err.Error())
		return
	}
	// 验证密码
	if !user.CheckPassword(req.Password){
		utils.Unauthorized(c, "用户名或密码错误")
		return
	}
	// 生成令牌
	token, err := models.GenerateToken(user.ID)
	if err != nil {
		utils.ServerError(c, "生成令牌失败: "+err.Error())
		return
	}
	// 返回用户信息和令牌
	utils.Success(c,gin.H{
		"user": gin.H{
			"id":       user.ID,
			"username": user.Username,
			"email":    user.Email,
		},
		"token":     token.Token,
		"expires_at": token.ExpiresAt,
	})
}

// Logout 用户登出
func Logout(c *gin.Context){
	tokenStr :=c.GetHeader("Authorization")
	if tokenStr == "" {
		utils.BadRequest(c, "未提供令牌")
		return
	}
	// 删除令牌
	if err := models.DeleteToken(tokenStr); err != nil{
		utils.ServerError(c, "登出失败：" + err.Error())
		return
	}
	utils.Success(c, gin.H{"message": "成功登出"})
}

// GetCurrentUser 获取当前登录用户信息
func GetCurrentUser(c *gin.Context){
	// 从上下文获取用户ID（由中间件设置）
	userID,exists := c.Get("userId")
		// 使用zap打印不同级别的日志
	log.Printf("当前用户ID: %v", userID)
	if !exists {
		utils.Unauthorized(c, "未授权访问")
		return
	}
	// 查询用户信息
	user,err :=models.GetUserById(userID.(uint))
	if err != nil {
		utils.ServerError(c, "查询用户信息失败: "+err.Error())
		return
	}

	utils.Success(c, gin.H{
		"id":       user.ID,
		"username": user.Username,
		"email":    user.Email,
		"created_at": user.CreatedAt,
	})
}